/******************************************************************************* * Copyright (c) 2011 Kai Toedter and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html. * * Contributors: * Kai Toedter - initial API and implementation ******************************************************************************/ package com.toedter.e4.demo.contacts.javafx.views; import com.toedter.e4.demo.contacts.generic.databinding.AggregateNameObservableValue; import com.toedter.e4.demo.contacts.generic.model.Contact; import java.io.ByteArrayInputStream; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.VPos; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import javax.inject.Inject; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.fx.core.databinding.IJFXBeanValueProperty; import org.eclipse.fx.core.databinding.JFXBeanProperties; import org.eclipse.osgi.internal.signedcontent.Base64; @SuppressWarnings("restriction") public class DetailsView { private final WritableValue writableValue = new WritableValue(); private int detailsPanelRow; private GridPane grid; private IJFXBeanValueProperty uiProp; private DataBindingContext ctx; private ImageView imageView; private TextField titleText; @Inject private EPartService partService; @Inject public DetailsView(BorderPane parent, final MApplication application) { Node node = createDetailsPanel(); parent.setCenter(node); } private Node createDetailsPanel() { uiProp = JFXBeanProperties.value("text"); ctx = new DataBindingContext(); grid = new GridPane(); grid.getStyleClass().add("my-gridpane"); grid.setHgap(10); grid.setVgap(5); grid.setPadding(new Insets(10, 10, 10, 10)); detailsPanelRow = 0; addSeparator("General"); titleText = addProperty("Title", "title"); addProperty("Name", "name"); addProperty("Company", "company"); addProperty("Job Title", "jobTitle"); addProperty("Note", "note", 2); Image image = new Image(getClass().getResourceAsStream("dummy.png")); imageView = new ImageView(image); grid.add(imageView, 3, 0, 1, 5); GridPane.setValignment(imageView, VPos.BOTTOM); GridPane.setHalignment(imageView, HPos.LEFT); double scaleFactor = 102 / image.getHeight(); imageView.setFitHeight(scaleFactor * image.getHeight()); imageView.setFitWidth(scaleFactor * image.getWidth()); titleText.heightProperty().addListener(new ChangeListener<Number>() { public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { Image image = imageView.getImage(); double scaleFactor = ((Double) newValue + 3.5) * 4 / image.getHeight(); imageView.setFitHeight(scaleFactor * image.getHeight()); imageView.setFitWidth(scaleFactor * image.getWidth()); } }); addSeparator("Business Address"); addProperty("Street", "street", 2); addProperty("City", "city", 2); addProperty("Zip", "zip", 2); addProperty("Country", "country", 2); addSeparator("Business Phones"); addProperty("Phone", "phone", 2); addProperty("Mobile", "mobile", 2); addSeparator("Business Internet"); addProperty("E-Mail", "email", 2); addProperty("Web Site", "webPage", 2); ColumnConstraints separatorConstraints = new ColumnConstraints(); separatorConstraints.setHalignment(HPos.LEFT); grid.getColumnConstraints().add(separatorConstraints); ColumnConstraints labelConstraints = new ColumnConstraints(); labelConstraints.setHalignment(HPos.RIGHT); grid.getColumnConstraints().add(labelConstraints); ScrollPane scrollPane = new ScrollPane(); scrollPane.setFitToWidth(true); scrollPane.setContent(grid); scrollPane.autosize(); return scrollPane; } public void addSeparator(String text) { Label label = new Label(text); label.getStyleClass().add("separator-label"); grid.add(label, 0, detailsPanelRow++, 4, 1); } public TextField addProperty(String labelText, String property, int span) { Label label = new Label(labelText); grid.add(label, 1, detailsPanelRow); TextField textField = new TextField(); grid.add(textField, 2, detailsPanelRow); GridPane.setConstraints(textField, 2, detailsPanelRow, span, 1, HPos.LEFT, VPos.BASELINE, Priority.ALWAYS, Priority.ALWAYS); detailsPanelRow++; if ("Name".equals(labelText)) { ctx.bindValue(uiProp.observe(textField), new AggregateNameObservableValue(writableValue)); } else { ctx.bindValue(uiProp.observe(textField), BeanProperties.value(property).observeDetail(writableValue)); } return textField; } public TextField addProperty(String labelText, String inputText) { return addProperty(labelText, inputText, 1); } @Inject public void setSelection(@Optional final Contact contact) { if (contact != null) { writableValue.setValue(contact); String jpegString = contact.getJpegString(); byte[] imageBytes = Base64.decode(jpegString.getBytes()); ByteArrayInputStream is = new ByteArrayInputStream(imageBytes); imageView.setImage(new Image(is)); } } }